#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <pthread.h>

#define PORT 8080

int blink_interval = 0;
int stop_blinking = 0;
pthread_t blink_thread;

void set_led(int state) {
    if (state) {
        printf("LED is ON\n");
    } else {
        printf("LED is OFF\n");
    }
}

void initial_blink(int interval, int times) {
    for (int i = 0; i < times; i++) {
        set_led(1);
        sleep(interval);
        set_led(0);
        sleep(interval);
    }
}

void* blink_led(void* arg) {
    while (!stop_blinking) {
        set_led(1);
        sleep(blink_interval);
        set_led(0);
        sleep(blink_interval);
    }
    return NULL;
}
blink_interval 用于存储 LED 闪烁的间隔时间。
stop_blinking 是一个标志，用于控制是否停止闪烁。
blink_thread 是线程标识符。
set_led 函数根据传入的状态值打印相应的 LED 状态信息。
initial_blink 函数实现了以特定间隔和次数进行 LED 的初始闪烁，通过循环交替点亮和熄灭 LED，并在每次状态切换时进行相应的延时。
blink_led 函数在线程中运行，只要 stop_blinking 为假，就会按照设定的 blink_interval 不断交替点亮和熄灭 LED，并进行延时。
总的来说，这些函数共同协作，实现了对 LED 闪烁状态的控制和相关操作，包括初始的特定闪烁以及后续根据客户端指令进行的动态控制。

void handle_client(int client_socket) {
    char buffer[1024] = {0};
    while (1) {
        int valread = read(client_socket, buffer, 1024);
        if (valread > 0) {
            buffer[valread] = '\0';
            if (strcmp(buffer, "on") == 0) {
                stop_blinking = 1;
                pthread_join(blink_thread, NULL);
                set_led(1);
            } else if (strcmp(buffer, "off") == 0) {
                stop_blinking = 1;
                pthread_join(blink_thread, NULL);
                set_led(0);
            } else if (strncmp(buffer, "blink", 5) == 0) {
                int interval = atoi(buffer + 6);
                if (interval > 0) {
                    stop_blinking = 1;
                    pthread_join(blink_thread, NULL);
                    blink_interval = interval;
                    stop_blinking = 0;
                    pthread_create(&blink_thread, NULL, blink_led, NULL);
                } else {
                    printf("Invalid interval received: %s\n", buffer);
                }
            } else {
                printf("Invalid command received: %s\n", buffer);
            }
        } else {
            break;
        }
    }
    close(client_socket);
}
这段代码定义的 handle_client 函数主要用于处理与客户端的交互：
定义一个缓冲区 buffer 来接收客户端发送的数据。
进入一个循环不断读取客户端发送的数据。
根据读取到的数据内容进行不同的操作：
如果是 "on"，则停止闪烁（通过设置标志位和线程操作）并点亮 LED。
如果是 "off"，同样停止闪烁并关闭 LED。
如果是以 "blink" 开头，提取出后面的数字作为闪烁间隔，进行相应的闪烁设置（停止当前闪烁、创建新线程进行新间隔的闪烁），如果间隔不合法则打印错误信息。
对于其他不合法的命令，打印错误提示。
最后关闭与该客户端连接的套接字。
这样的设计可以根据客户端发送的特定指令来控制 LED 的状态和闪烁行为，实现了通过网络对 LED 进行远程控制的基本逻辑。比如，客户端发送 "on" 就可以让 LED 常亮，发送 "blink 2" 就可以让 LED 以 2 秒的间隔闪烁等。

该函数是一个处理客户端请求的函数，它使用一个死循环来不断读取客户端发送的消息，如果收到的消息是“on”，则停止闪烁灯并设置LED为1，如果收到的消息是“off”，则停止闪烁灯并设置LED为0，如果收到的消息以“blink”开头，则将接下来的数字作为闪烁间隔时间，然后启动一个线程来闪烁LED灯，直到收到停止闪烁的命令或者关闭连接。


int main() {
    int server_fd, client_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
        // 开机时 LED 闪烁
    initial_blink(1, 5);  // 每秒闪烁一次，闪烁5次
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("Socket failed");
        exit(EXIT_FAILURE);
    }

    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("Setsockopt failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;  //设置地址族为 IPv4。
    address.sin_addr.s_addr = INADDR_ANY;  //设置地址为任意地址
    address.sin_port = htons(PORT);  //设置端口号为指定的端口号

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("Bind failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    if (listen(server_fd, 3) < 0) {
        perror("Listen failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    while (1) {
        if ((client_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
            perror("Accept failed");
            close(server_fd);
            exit(EXIT_FAILURE);
        }
        handle_client(client_socket);
    }

    return 0;
}
这段 C 语言代码主要实现了一个简单的服务器程序的基本框架：
initial_blink(1, 5)：在程序开始时执行一个 LED 闪烁的操作，每秒闪烁一次，共闪烁 5 次。
创建套接字：使用 socket 函数创建一个套接字，如果创建失败则打印错误并退出程序。
设置套接字选项：通过 setsockopt 允许地址和端口重用。
配置服务器地址信息：包括协议族、任意本地地址和指定端口。
绑定套接字到地址：如果绑定失败则打印错误并关闭套接字后退出。
监听套接字：指定监听队列长度。
进入一个无限循环，不断接受客户端连接，并调用 handle_client 函数处理客户端请求。
这只是一个基础的框架，实际应用中还需要在 handle_client 函数中实现具体的与客户端交互的逻辑。例如，接收和发送数据等操作。